#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信开放平台图片生成工具
用于将logo图片调整为微信开放平台要求的尺寸
"""

from PIL import Image
import os
import sys

def resize_logo(input_path, output_path, size, quality=95):
    """
    调整logo图片尺寸
    
    :param input_path: 输入图片路径
    :param output_path: 输出图片路径
    :param size: 目标尺寸 (width, height)
    :param quality: 图片质量 (1-100)
    """
    try:
        # 检查输入文件是否存在
        if not os.path.exists(input_path):
            print(f"错误: 找不到文件 {input_path}")
            return False
        
        # 打开原始图片
        img = Image.open(input_path)
        print(f"原始图片尺寸: {img.size[0]}×{img.size[1]} 像素")
        print(f"原始图片模式: {img.mode}")
        
        # 转换为RGBA模式（支持透明度）
        if img.mode != 'RGBA':
            img = img.convert('RGBA')
            print("已转换为RGBA模式（支持透明度）")
        
        # 调整尺寸，使用高质量重采样
        img_resized = img.resize(size, Image.Resampling.LANCZOS)
        
        # 保存为PNG格式
        img_resized.save(output_path, 'PNG', optimize=True)
        
        # 检查文件大小
        file_size = os.path.getsize(output_path) / 1024  # KB
        print(f"\n✓ 生成图片: {output_path}")
        print(f"  尺寸: {size[0]}×{size[1]} 像素")
        print(f"  文件大小: {file_size:.2f} KB")
        
        if file_size > 300:
            print("  ⚠ 警告: 文件大小超过300KB，建议使用TinyPNG压缩")
        else:
            print("  ✓ 文件大小符合要求（≤300KB）")
        
        return True
        
    except Exception as e:
        print(f"错误: {str(e)}")
        return False

def compress_png(input_path, output_path):
    """
    压缩PNG图片（使用PIL的优化选项）
    
    :param input_path: 输入图片路径
    :param output_path: 输出图片路径
    """
    try:
        img = Image.open(input_path)
        # 使用optimize选项压缩
        img.save(output_path, 'PNG', optimize=True, compress_level=9)
        
        original_size = os.path.getsize(input_path) / 1024
        compressed_size = os.path.getsize(output_path) / 1024
        
        print(f"\n压缩结果:")
        print(f"  原始大小: {original_size:.2f} KB")
        print(f"  压缩后: {compressed_size:.2f} KB")
        print(f"  压缩率: {(1 - compressed_size/original_size)*100:.1f}%")
        
        return True
    except Exception as e:
        print(f"压缩失败: {str(e)}")
        return False

def main():
    print("=" * 50)
    print("微信开放平台图片生成工具")
    print("=" * 50)
    
    # 检查命令行参数
    if len(sys.argv) > 1:
        logo_path = sys.argv[1]
    else:
        # 默认路径（请根据实际情况修改）
        logo_path = input("请输入logo图片路径（或直接回车使用默认路径）: ").strip()
        if not logo_path:
            # 常见的logo文件位置
            possible_paths = [
                "static/image/login/logo.png",
                "static/logo.png",
                "logo.png",
                "../logo.png"
            ]
            
            for path in possible_paths:
                if os.path.exists(path):
                    logo_path = path
                    print(f"使用默认路径: {logo_path}")
                    break
            
            if not logo_path or not os.path.exists(logo_path):
                print("错误: 找不到logo图片，请手动指定路径")
                print("用法: python resize_logo.py <logo图片路径>")
                return
    
    # 检查文件是否存在
    if not os.path.exists(logo_path):
        print(f"错误: 找不到文件 {logo_path}")
        return
    
    print(f"\n使用logo文件: {logo_path}\n")
    
    # 生成28×28像素水印图片
    print("1. 生成28×28像素水印图片...")
    watermark_path = "watermark_28x28.png"
    if resize_logo(logo_path, watermark_path, (28, 28)):
        # 如果文件太大，尝试压缩
        if os.path.getsize(watermark_path) / 1024 > 300:
            print("  尝试压缩...")
            compress_png(watermark_path, watermark_path)
    
    print("\n" + "-" * 50 + "\n")
    
    # 生成108×108像素高清图片
    print("2. 生成108×108像素高清图片...")
    hd_path = "hd_108x108.png"
    if resize_logo(logo_path, hd_path, (108, 108)):
        # 如果文件太大，尝试压缩
        if os.path.getsize(hd_path) / 1024 > 300:
            print("  尝试压缩...")
            compress_png(hd_path, hd_path)
    
    print("\n" + "=" * 50)
    print("完成！")
    print("=" * 50)
    print(f"\n生成的文件:")
    print(f"  - {watermark_path} (28×28像素)")
    print(f"  - {hd_path} (108×108像素)")
    print(f"\n请检查文件大小是否符合要求（≤300KB）")
    print(f"如果文件过大，建议使用TinyPNG (https://tinypng.com/) 进一步压缩")

if __name__ == "__main__":
    main()

